package com.learning.spring.bean.annotation.config.service.impl;

import com.learning.spring.bean.annotation.config.entity.User;
import com.learning.spring.bean.annotation.config.service.IAddressService;
import com.learning.spring.bean.annotation.config.service.IRoleService;
import com.learning.spring.bean.annotation.config.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * ClassName: UserServiceImpl
 * Description: 用户业务类
 * <p>
 * 1. 使用 @Service 注解标注该类，它可以被Spring 容器识别，容器自动将POJO转换为容器管理的Bean
 * 2. 等同于 <bean id="userServiceXmlConfig" class="com.learning.spring.bean.annotation.config.service.impl.UserServiceImpl"/>
 * <p>
 * Date: 2020/7/22 16:19 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Service
public class UserServiceImpl implements IUserService {

    /**
     * 1. 使用注解 @Autowired 进行自动注入（默认是按类型 byType 匹配）
     * 2. 使用注解 @Qualifier(value = "roleServiceImpl") 实现按Bean的名称匹配
     * 3. 支持对属性进行标注，也支持对类方法进行标注
     */
    @Autowired
    @Qualifier(value = "roleServiceImpl")
    private IRoleService roleService;

    /**
     * 4. 如果容器中没有和标注变量类型匹配，容器启动时报 NoSuchBeanDefinitionException
     * 4.1 可以使用 required = false 实现即使找不到匹配的Bean，也不会报错
     * <p>
     * 7. 对延迟依赖注入的支持。注解 @Lazy 必须同时标注在属性以及目标Bean上（标注在属性上）
     */
    @Lazy
    @Autowired(required = false)
    private IAddressService addressService;

    /**
     * 5. 对集合类（List、Map）进行标注：Spring 会将容器中类型匹配的所有Bean都注入进来
     */
    @Autowired
    private List<IRoleService> roleServiceList;

    /**
     * 6. 其中key是Bean的名字，value是所有实现了 IRoleService 的Bean
     */
    @Autowired
    private Map<String, IRoleService> roleServiceMap;

    @Override
    public int add(User user) {
        return 0;
    }

    @Override
    public int delete(int id) {
        return 0;
    }

    @Override
    public int update(User user) {
        return 0;
    }

    @Override
    public User select(int id) {
        return null;
    }
}
